home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Amiga Format CD 42
/
Amiga Format AFCD42 (Issue 126, Aug 1999).iso
/
-serious-
/
sound
/
scope_xt4
/
src
/
deli_fft.i
next >
Wrap
Text File
|
1999-05-14
|
38KB
|
1,776 lines
; this ultra fast FFT routine was taken from:
;-------------------------------------------------------
; DeliTracker FFTAnalyzer genie module V1.6 (19 Apr 95)
;
; © 1994-95 by Delirium Softdesign
; (Peter Kunath and Frank Riffel)
; All rights reserved.
; Special thanks to Kim Øyhus for
; the fastest FFT routine ever done
; on the Amiga.
;-------------------------------------------------------
;
; adapted+optimized by Smack/Infect!
; Fri 30-Apr-99
;
;-------------------------------------------------------------------------
;
; !! uses FPU (requires emulation on 68040/060) !!
;
; precalculates log_table used by 'deli_fft'
;
fft_init
lea (fft_log_table),a0
move #255,d2
moveq #-1,d7
fmove.w #0,fp1
fmove.w #2,fp2
fmove.s #5.5,fp3
fmove.w #7500,fp4
fmove.w #0,fp5
fmove.w #1,fp6
.loop
fmove fp1,fp0
fadd fp2,fp0
flog2 fp0 ;!! n/a 68040/060 !!
fsub fp3,fp0
fbge .ge
fmove fp5,fp0
.ge fmul fp4,fp0
fmove.l fp0,d0
lsr.l #8,d0
cmp d2,d0
ble.b .le
move d2,d0
.le move.b d0,(a0)+
fadd fp6,fp1
dbf d7,.loop
rts
;-------------------------------------------------------------------------
;
; !! requires FPU (68881/2, 68040 or 68060) !!
;
; input:
; a0 - pointer to data array
; (504 8-bit-samples as signed words)
; d0 - NULL / NOT_NULL - linear / logarithmic intensity scale
;
; log_table - must be precalculated (call 'fft_init' at program start)
;
; output:
; the first 252 elements of the data array contain the spectrum
; as unsigned words
;
deli_fft
move.l d0,-(a7)
pea (a0)
lea (scrambled_1008w),a1
bsr scramble_data
bsr pass1_6
bsr pass2_6
bsr pass3_6
move #792-1,d4
lea (buffer_792w),a0
lea (scrambled_sincos,pc),a2
moveq #14,d7
.loop move (a0),d0
muls (a2)+,d0
lsr.l d7,d0 ;#14
move d0,(a0)+
dbf d4,.loop
bsr pass4_6
bsr pass5_6
bsr pass6_6
move.l (a7),a0
lea (scrambled_1008w),a1
bsr unscramble_data
move.l (a7)+,a0
lea (1008,a0),a1
lea (fft_log_table),a2
move #252-1,d7
move.l (a7)+,d6
fmove.w #25,fp5
.band_loop
move (a0),d1
move -(a1),d0
muls d1,d1
muls d0,d0
add.l d1,d0
fmove.l d0,fp0
fsqrt fp0
tst.l d6
bne.b .log
fmul fp5,fp0
fmove.l fp0,d0
swap d0
tst d0
beq.b .eq
moveq #-1,d0
.eq swap d0
move d0,(a0)+
dbf d7,.band_loop
bra.b .end
.log fmove.l fp0,d0
move.b (a2,d0.l),d0
lsl #8,d0
move d0,(a0)+
dbf d7,.band_loop
.end rts
scramble_data
move (a0)+,(a1)
move (a0)+,(164,a1)
move (a0)+,($148,a1)
move (a0)+,($1ec,a1)
move (a0)+,($290,a1)
move (a0)+,($334,a1)
move (a0)+,($3d8,a1)
move (a0)+,($8c,a1)
move (a0)+,($a0,a1)
move (a0)+,($132,a1)
move (a0)+,($1d6,a1)
move (a0)+,($27a,a1)
move (a0)+,($31e,a1)
move (a0)+,($3c2,a1)
move (a0)+,($76,a1)
move (a0)+,($11a,a1)
move (a0)+,($12e,a1)
move (a0)+,($1d2,a1)
move (a0)+,($264,a1)
move (a0)+,($308,a1)
move (a0)+,($3ac,a1)
move (a0)+,($60,a1)
move (a0)+,($104,a1)
move (a0)+,($1a8,a1)
move (a0)+,($1bc,a1)
move (a0)+,($260,a1)
move (a0)+,($304,a1)
move (a0)+,($396,a1)
move (a0)+,($4a,a1)
move (a0)+,($ee,a1)
move (a0)+,($192,a1)
move (a0)+,($236,a1)
move (a0)+,($24a,a1)
move (a0)+,($2ee,a1)
move (a0)+,($392,a1)
move (a0)+,($46,a1)
move (a0)+,($d8,a1)
move (a0)+,($17c,a1)
move (a0)+,($220,a1)
move (a0)+,($2c4,a1)
move (a0)+,($2d8,a1)
move (a0)+,($37c,a1)
move (a0)+,($30,a1)
move (a0)+,($d4,a1)
move (a0)+,($178,a1)
move (a0)+,($20a,a1)
move (a0)+,($2ae,a1)
move (a0)+,($352,a1)
move (a0)+,($366,a1)
move (a0)+,($1a,a1)
move (a0)+,($be,a1)
move (a0)+,($162,a1)
move (a0)+,($206,a1)
move (a0)+,($2aa,a1)
move (a0)+,($33c,a1)
move (a0)+,($3e0,a1)
move (a0)+,(4,a1)
move (a0)+,($a8,a1)
move (a0)+,($14c,a1)
move (a0)+,($1f0,a1)
move (a0)+,($294,a1)
move (a0)+,($338,a1)
move (a0)+,($3dc,a1)
move (a0)+,($7e,a1)
move (a0)+,($92,a1)
move (a0)+,($136,a1)
move (a0)+,($1da,a1)
move (a0)+,($27e,a1)
move (a0)+,($322,a1)
move (a0)+,($3c6,a1)
move (a0)+,($7a,a1)
move (a0)+,($11e,a1)
move (a0)+,($120,a1)
move (a0)+,($1c4,a1)
move (a0)+,($268,a1)
move (a0)+,($30c,a1)
move (a0)+,($3b0,a1)
move (a0)+,($64,a1)
move (a0)+,($108,a1)
move (a0)+,($1ac,a1)
move (a0)+,($1c0,a1)
move (a0)+,($252,a1)
move (a0)+,($2f6,a1)
move (a0)+,($39a,a1)
move (a0)+,($4e,a1)
move (a0)+,($f2,a1)
move (a0)+,($196,a1)
move (a0)+,($23a,a1)
move (a0)+,($24e,a1)
move (a0)+,($2f2,a1)
move (a0)+,($384,a1)
move (a0)+,($38,a1)
move (a0)+,($dc,a1)
move (a0)+,($180,a1)
move (a0)+,($224,a1)
move (a0)+,($2c8,a1)
move (a0)+,($2dc,a1)
move (a0)+,($380,a1)
move (a0)+,($34,a1)
move (a0)+,($c6,a1)
move (a0)+,($16a,a1)
move (a0)+,($20e,a1)
move (a0)+,($2b2,a1)
move (a0)+,($356,a1)
move (a0)+,($36a,a1)
move (a0)+,($1e,a1)
move (a0)+,($c2,a1)
move (a0)+,($166,a1)
move (a0)+,($1f8,a1)
move (a0)+,($29c,a1)
move (a0)+,($340,a1)
move (a0)+,($3e4,a1)
move (a0)+,(8,a1)
move (a0)+,($ac,a1)
move (a0)+,($150,a1)
move (a0)+,($1f4,a1)
move (a0)+,($298,a1)
move (a0)+,($32a,a1)
move (a0)+,($3ce,a1)
move (a0)+,($82,a1)
move (a0)+,($96,a1)
move (a0)+,($13a,a1)
move (a0)+,($1de,a1)
move (a0)+,($282,a1)
move (a0)+,($326,a1)
move (a0)+,($3ca,a1)
move (a0)+,($6c,a1)
move (a0)+,($110,a1)
move (a0)+,($124,a1)
move (a0)+,($1c8,a1)
move (a0)+,($26c,a1)
move (a0)+,($310,a1)
move (a0)+,($3b4,a1)
move (a0)+,($68,a1)
move (a0)+,($10c,a1)
move (a0)+,($19e,a1)
move (a0)+,($1b2,a1)
move (a0)+,($256,a1)
move (a0)+,($2fa,a1)
move (a0)+,($39e,a1)
move (a0)+,($52,a1)
move (a0)+,($f6,a1)
move (a0)+,($19a,a1)
move (a0)+,($23e,a1)
move (a0)+,($240,a1)
move (a0)+,($2e4,a1)
move (a0)+,($388,a1)
move (a0)+,($3c,a1)
move (a0)+,($e0,a1)
move (a0)+,($184,a1)
move (a0)+,($228,a1)
move (a0)+,($2cc,a1)
move (a0)+,($2e0,a1)
move (a0)+,($372,a1)
move (a0)+,($26,a1)
move (a0)+,($ca,a1)
move (a0)+,($16e,a1)
move (a0)+,($212,a1)
move (a0)+,($2b6,a1)
move (a0)+,($35a,a1)
move (a0)+,($36e,a1)
move (a0)+,($22,a1)
move (a0)+,($b4,a1)
move (a0)+,($158,a1)
move (a0)+,($1fc,a1)
move (a0)+,($2a0,a1)
move (a0)+,($344,a1)
move (a0)+,($3e8,a1)
move (a0)+,(12,a1)
move (a0)+,($b0,a1)
move (a0)+,($154,a1)
move (a0)+,($1e6,a1)
move (a0)+,($28a,a1)
move (a0)+,($32e,a1)
move (a0)+,($3d2,a1)
move (a0)+,($86,a1)
move (a0)+,($9a,a1)
move (a0)+,($13e,a1)
move (a0)+,($1e2,a1)
move (a0)+,($286,a1)
move (a0)+,($318,a1)
move (a0)+,($3bc,a1)
move (a0)+,($70,a1)
move (a0)+,($114,a1)
move (a0)+,($128,a1)
move (a0)+,($1cc,a1)
move (a0)+,($270,a1)
move (a0)+,($314,a1)
move (a0)+,($3b8,a1)
move (a0)+,($5a,a1)
move (a0)+,($fe,a1)
move (a0)+,($1a2,a1)
move (a0)+,($1b6,a1)
move (a0)+,($25a,a1)
move (a0)+,($2fe,a1)
move (a0)+,($3a2,a1)
move (a0)+,($56,a1)
move (a0)+,($fa,a1)
move (a0)+,($18c,a1)
move (a0)+,($230,a1)
move (a0)+,($244,a1)
move (a0)+,($2e8,a1)
move (a0)+,($38c,a1)
move (a0)+,($40,a1)
move (a0)+,($e4,a1)
move (a0)+,($188,a1)
move (a0)+,($22c,a1)
move (a0)+,($2be,a1)
move (a0)+,($2d2,a1)
move (a0)+,($376,a1)
move (a0)+,($2a,a1)
move (a0)+,($ce,a1)
move (a0)+,($172,a1)
move (a0)+,($216,a1)
move (a0)+,($2ba,a1)
move (a0)+,($35e,a1)
move (a0)+,($360,a1)
move (a0)+,($14,a1)
move (a0)+,($b8,a1)
move (a0)+,($15c,a1)
move (a0)+,($200,a1)
move (a0)+,($2a4,a1)
move (a0)+,($348,a1)
move (a0)+,($3ec,a1)
move (a0)+,($10,a1)
move (a0)+,($a2,a1)
move (a0)+,($146,a1)
move (a0)+,($1ea,a1)
move (a0)+,($28e,a1)
move (a0)+,($332,a1)
move (a0)+,($3d6,a1)
move (a0)+,($8a,a1)
move (a0)+,($9e,a1)
move (a0)+,($142,a1)
move (a0)+,($1d4,a1)
move (a0)+,($278,a1)
move (a0)+,($31c,a1)
move (a0)+,($3c0,a1)
move (a0)+,($74,a1)
move (a0)+,($118,a1)
move (a0)+,($12c,a1)
move (a0)+,($1d0,a1)
move (a0)+,($274,a1)
move (a0)+,($306,a1)
move (a0)+,($3aa,a1)
move (a0)+,($5e,a1)
move (a0)+,($102,a1)
move (a0)+,($1a6,a1)
move (a0)+,($1ba,a1)
move (a0)+,($25e,a1)
move (a0)+,($302,a1)
move (a0)+,($3a6,a1)
move (a0)+,($48,a1)
move (a0)+,($ec,a1)
move (a0)+,($190,a1)
move (a0)+,($234,a1)
move (a0)+,($248,a1)
move (a0)+,($2ec,a1)
move (a0)+,($390,a1)
move (a0)+,($44,a1)
move (a0)+,($e8,a1)
move (a0)+,($17a,a1)
move (a0)+,($21e,a1)
move (a0)+,($2c2,a1)
move (a0)+,($2d6,a1)
move (a0)+,($37a,a1)
move (a0)+,($2e,a1)
move (a0)+,($